﻿#include "SignalEdit.h"
#include "ui_SignalEdit.h"
#include "ModelControl/DataTypeCombox.h"
#include <QDebug>

SignalEdit::SignalEdit(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SignalEdit)
{
    ui->setupUi(this);
    initial();
}

SignalEdit::~SignalEdit()
{
    delete ui;
}
/**
 * @brief SignalEdit::setselectedTopicId 设置所选行的主题Id
 * @param selectedTopicId 主题Id
 */
void SignalEdit::setselectedTopicId(const QVariant &selectedTopicId)
{
    m_SelectedTopicId = selectedTopicId;
}

/**
 * @brief SignalEdit::on_pushButton_addStruct_clicked 添加结构体
 */
void SignalEdit::on_pushButton_addStruct_clicked()
{
    //判断是否选择了主题，否则无法新增信号
    m_SelectedTopicId = emit sgl_GetSelectedTopicId();
    if(m_SelectedTopicId==0){
        QMessageBox::information(this,"错误提示","未选择主题",QMessageBox::Ok);
    }else{
        emit sgl_ShowStructDisplay(1);
    }
}

/**
 * @brief SignalEdit::on_pushButton_addSignal_clicked 添加信号
 */
void SignalEdit::on_pushButton_addSignal_clicked()
{
    //判断是否选择了主题，否则无法新增信号
    m_SelectedTopicId = emit sgl_GetSelectedTopicId();
    if(m_SelectedTopicId==0){
        QMessageBox::information(this,"错误提示","未选择主题",QMessageBox::Ok);
    }else{
        QVector<QVariant> signalVec = emit sgl_AddSignal(m_SelectedTopicId.toInt());
        ui->treeView_signal->addRowData(signalVec[0],signalVec);
        //设置字偏移和位偏移列为不可编辑
        ui->treeView_signal->setCellEditabled(signalVec[0],3,false);
        ui->treeView_signal->setCellEditabled(signalVec[0],4,false);
    }
}

/**
 * @brief SignalEdit::on_pushButton_delete_clicked 删除信号
 */
void SignalEdit::on_pushButton_delete_clicked()
{
    if(m_SelectedTopicId==0){
        QMessageBox::information(this,"错误提示","未选择主题",QMessageBox::Ok);
    }else{
        QVariant signalId = ui->treeView_signal->getSelectRowId();
        ui->treeView_signal->deleteRow(signalId);
        emit sgl_DeleteSignal(m_SelectedTopicId.toInt(), signalId); //signalId即信号Id
    }
}

/**
 * @brief SignalEdit::on_pushButton_up_clicked 信号上移
 */
void SignalEdit::on_pushButton_up_clicked()
{
    //判定ui->treeView_signal->getSelectRowId()是否有效
    QVariant rowId = ui->treeView_signal->getSelectRowId();
    if(!rowId.isValid()){
        return;
    }
    //获取行Id，行索引，行数据，删除源行后，在新位置插入该行数据
    QVector<QVariant> dataVec;
    int index;
    QVariant parentRowId;
    ui->treeView_signal->getRowIndex(rowId,index,parentRowId);
    ui->treeView_signal->getRowData(rowId,dataVec);
    //判断顶部边界
    if(index<=0){
        return;
    }
    ui->treeView_signal->deleteRow(rowId);
    ui->treeView_signal->insertRowData(rowId,dataVec,index-1,parentRowId);
    //设置新插入的行为当前项，便于继续直接移动
    QModelIndex newIndex = ui->treeView_signal->model()->index(index-1,0);
    ui->treeView_signal->setCurrentIndex(newIndex);
}

/**
 * @brief SignalEdit::on_pushButton_down_clicked 信号下移
 */
void SignalEdit::on_pushButton_down_clicked()
{
    //判定ui->treeView_signal->getSelectRowId()是否有效
    QVariant rowId = ui->treeView_signal->getSelectRowId();
    if(!rowId.isValid()){
        return;
    }
    //获取行Id，行索引，行数据，删除源行后，在新位置插入该行数据
    QVector<QVariant> dataVec;
    int index;
    QVariant parentRowId;
    ui->treeView_signal->getRowIndex(rowId,index,parentRowId);
    ui->treeView_signal->getRowData(rowId,dataVec);
    //获取行总数，并判定底部边界
    int rowCount = ui->treeView_signal->model()->rowCount();
    if(index==rowCount-1){
        return;
    }
    ui->treeView_signal->deleteRow(rowId);
    ui->treeView_signal->insertRowData(rowId,dataVec,index+1,parentRowId);
    //设置新插入的行为当前项，便于继续直接移动
    QModelIndex newIndex = ui->treeView_signal->model()->index(index+1,0);
    ui->treeView_signal->setCurrentIndex(newIndex);
}

/**
 * @brief SignalEdit::on_lineEdit_search_textChanged 搜索文本改变
 * @param arg1 搜索文本
 */
void SignalEdit::on_lineEdit_search_textChanged(const QString &arg1)
{
    ui->treeView_signal->setFilterRegExp(arg1);
}

/**
 * @brief SignalEdit::initial 初始化
 */
void SignalEdit::initial()
{
    m_SelectedTopicId = 0;
    //设置表头
    ui->treeView_signal->addColumn("信号Id");
    ui->treeView_signal->addColumn("信号名称");
    ui->treeView_signal->addColumnAndRegisterControl<DataTypeCombox>("数据类型");
    ui->treeView_signal->addColumn("字偏移");
    ui->treeView_signal->addColumn("位偏移");
    ui->treeView_signal->addColumn("长度");
    ui->treeView_signal->addColumn("精度");
    ui->treeView_signal->addColumn("单位");
    //设置表格视图属性
    ui->treeView_signal->setSelectionBehavior(QAbstractItemView::SelectRows);
    //为结果码添加相应的文本信息
    m_ResultTextVec.append("成功");
    m_ResultTextVec.append("原主题不存在");
    m_ResultTextVec.append("主题Id存在重复");
    m_ResultTextVec.append("主题名称存在重复");
    m_ResultTextVec.append("结构体Id存在重复");
    m_ResultTextVec.append("结构体名称存在重复");
    m_ResultTextVec.append("信号Id存在重复");
    m_ResultTextVec.append("信号名称存在重复");
    m_ResultTextVec.append("枚举Id存在重复");
    m_ResultTextVec.append("枚举名称存在重复");

    // 信号单元格值改变
    connect(ui->treeView_signal,&GY_IdTreeView::sgl_CellValueChange,this,&SignalEdit::slt_SignalCellValueChanged);
}

/**
 * @brief SignalEdit::on_pushButton_comfirm_clicked 确认配置
 */
void SignalEdit::on_pushButton_comfirm_clicked()
{
    //TODO 确认主题和信号页面的配置信息，转到下一个界面配置
}

/**
 * @brief slt_SignalCellValueChanged 单元格值改变
 * @param rowId 行Id
 * @param columnIndex 列索引
 * @param value 改变后的值
 * @return 结果码
 */
int SignalEdit::slt_SignalCellValueChanged(const QVariant &rowId, const int columnIndex, const QVariant &value)
{
    //过滤信号字偏移和位偏移的列
    if(columnIndex==3||columnIndex==4){//字偏移和位偏移列
        return -1;
    }
    int result = emit sgl_SignalCellValueChanged(rowId,columnIndex,value);
    if(result != 0){
        QMessageBox::information(this,"修改失败",m_ResultTextVec[result],QMessageBox::Ok);
    }else{
        if(columnIndex==0){ //如果是主题Id列，则需要删除item，再重新添加一个item
            QVector<QVariant> newDataVec;
            QString signalIdText = ui->treeView_signal->getCellText(rowId,0); //获取信号Id
            QString signalNameText = ui->treeView_signal->getCellText(rowId,1); //获取信号名称
            QString signalTypeText = ui->treeView_signal->getCellText(rowId,2); //获取数据类型
            QString signalByteOffsetText = ui->treeView_signal->getCellText(rowId,3); //获取字偏移
            QString signalBitOffsetText = ui->treeView_signal->getCellText(rowId,4); //获取位偏移
            QString signalLenText = ui->treeView_signal->getCellText(rowId,5); //获取长度
            QString signalAccText = ui->treeView_signal->getCellText(rowId,6); //获取精度
            QString signalUnitText = ui->treeView_signal->getCellText(rowId,7); //获取单位
            QString signalMaxText = ui->treeView_signal->getCellText(rowId,8); //获取最大值
            QString signalMinText = ui->treeView_signal->getCellText(rowId,9); //获取最小值
            QString signalRemarkText = ui->treeView_signal->getCellText(rowId,10); //获取备注
            newDataVec.append(signalIdText);
            newDataVec.append(signalNameText);
            newDataVec.append(signalTypeText);
            newDataVec.append(signalByteOffsetText);
            newDataVec.append(signalBitOffsetText);
            newDataVec.append(signalLenText);
            newDataVec.append(signalAccText);
            newDataVec.append(signalUnitText);
            newDataVec.append(signalMaxText);
            newDataVec.append(signalMinText);
            newDataVec.append(signalRemarkText);
            ui->treeView_signal->deleteRow(rowId);
            ui->treeView_signal->addRowData(value,newDataVec);
        }
    }
    return result;
}
